package cn.codergege.kotlinclass.interf

interface Ia {
    val va: Int // 抽象属性
    var vb: Int // 抽象属性
    val vc get() = 1 // 提供 getter 的属性
    var vd
        get() = 2
        set(value) {
            println("如果子类重写了 vd 属性, 这里不会执行")
            println("没有 backing field, 不能保存状态, 这么做基本上没意义")
        }
    fun a() // 抽象方法
    fun b() = println("b") // 具体方法, 不用 override
}

class A(override val va: Int, override var vb: Int) : Ia {
    // vc 和 vc 都有实现代码, 所以不必须重写
    // 我们重写个 vd 吧
    override var vd = 2222
    override fun a() {
        println("a")
    }
    // 可以重写, 也可以不重写
    override fun b() {
        super.b()
        println("A b")
    }
}

fun main(args: Array<String>) {
    val objA = A(11, 22)
    println(objA.va) // 11
    println(objA.vb) // 22
    println(objA.vc) // 1
    println(objA.vd) // 2222
    objA.vd = 3 // 如果没重写 vd, 是无法保存状态的, 但是重写了.
    println(objA.vd) // 3
    objA.a() // a
    objA.b()  // b 换行 A b
}

interface Ib {
    val b: Int
}
interface Ic: Ib {
    val c: Int
    override val b: Int
        get() = c * 2
}

// 属性 b 已经有实现代码了, 所以不用重写
class D(override val c: Int, val d: Int) : Ic {
}

// 解决冲突
interface Ie {
    fun f() = println("Ie")
}
interface If {
    fun f() = println("If")
}
class Cg: Ie, If {
    // 必须重写了, 因为不知道要调用哪个 f()
    override fun f() {
        println("Cg")
        // 需要指定调用哪个父类接口的实现方法可以这样
        super<Ie>.f()
        super<If>.f()
    }
}